Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


RNS/Cryptography/aes/aes128.py de7e0996ce218f5b697c33ff3d64f1451f4a1f0a (de7e0996) Text, 12.34 KB

T8b949e# MIT License

T8b949e# Copyright (c) 2021 Or Gur Arie

T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:

T8b949e# The above copyright notice and this permission notice shall be included in all
T8b949e# copies or substantial portions of the Software.

T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.

T8b949e## AES lookup tables
T8b949e# resource: https://en.wikipedia.org/wiki/Rijndael_S-box
Te6edf3s_box Tff7b72= Tb4b4b4(
T79c0ff0x63Tb4b4b4, T79c0ff0x7CTb4b4b4, T79c0ff0x77Tb4b4b4, T79c0ff0x7BTb4b4b4, T79c0ff0xF2Tb4b4b4, T79c0ff0x6BTb4b4b4, T79c0ff0x6FTb4b4b4, T79c0ff0xC5Tb4b4b4, T79c0ff0x30Tb4b4b4, T79c0ff0x01Tb4b4b4, T79c0ff0x67Tb4b4b4, T79c0ff0x2BTb4b4b4, T79c0ff0xFETb4b4b4, T79c0ff0xD7Tb4b4b4, T79c0ff0xABTb4b4b4, T79c0ff0x76Tb4b4b4,
T79c0ff0xCATb4b4b4, T79c0ff0x82Tb4b4b4, T79c0ff0xC9Tb4b4b4, T79c0ff0x7DTb4b4b4, T79c0ff0xFATb4b4b4, T79c0ff0x59Tb4b4b4, T79c0ff0x47Tb4b4b4, T79c0ff0xF0Tb4b4b4, T79c0ff0xADTb4b4b4, T79c0ff0xD4Tb4b4b4, T79c0ff0xA2Tb4b4b4, T79c0ff0xAFTb4b4b4, T79c0ff0x9CTb4b4b4, T79c0ff0xA4Tb4b4b4, T79c0ff0x72Tb4b4b4, T79c0ff0xC0Tb4b4b4,
T79c0ff0xB7Tb4b4b4, T79c0ff0xFDTb4b4b4, T79c0ff0x93Tb4b4b4, T79c0ff0x26Tb4b4b4, T79c0ff0x36Tb4b4b4, T79c0ff0x3FTb4b4b4, T79c0ff0xF7Tb4b4b4, T79c0ff0xCCTb4b4b4, T79c0ff0x34Tb4b4b4, T79c0ff0xA5Tb4b4b4, T79c0ff0xE5Tb4b4b4, T79c0ff0xF1Tb4b4b4, T79c0ff0x71Tb4b4b4, T79c0ff0xD8Tb4b4b4, T79c0ff0x31Tb4b4b4, T79c0ff0x15Tb4b4b4,
T79c0ff0x04Tb4b4b4, T79c0ff0xC7Tb4b4b4, T79c0ff0x23Tb4b4b4, T79c0ff0xC3Tb4b4b4, T79c0ff0x18Tb4b4b4, T79c0ff0x96Tb4b4b4, T79c0ff0x05Tb4b4b4, T79c0ff0x9ATb4b4b4, T79c0ff0x07Tb4b4b4, T79c0ff0x12Tb4b4b4, T79c0ff0x80Tb4b4b4, T79c0ff0xE2Tb4b4b4, T79c0ff0xEBTb4b4b4, T79c0ff0x27Tb4b4b4, T79c0ff0xB2Tb4b4b4, T79c0ff0x75Tb4b4b4,
T79c0ff0x09Tb4b4b4, T79c0ff0x83Tb4b4b4, T79c0ff0x2CTb4b4b4, T79c0ff0x1ATb4b4b4, T79c0ff0x1BTb4b4b4, T79c0ff0x6ETb4b4b4, T79c0ff0x5ATb4b4b4, T79c0ff0xA0Tb4b4b4, T79c0ff0x52Tb4b4b4, T79c0ff0x3BTb4b4b4, T79c0ff0xD6Tb4b4b4, T79c0ff0xB3Tb4b4b4, T79c0ff0x29Tb4b4b4, T79c0ff0xE3Tb4b4b4, T79c0ff0x2FTb4b4b4, T79c0ff0x84Tb4b4b4,
T79c0ff0x53Tb4b4b4, T79c0ff0xD1Tb4b4b4, T79c0ff0x00Tb4b4b4, T79c0ff0xEDTb4b4b4, T79c0ff0x20Tb4b4b4, T79c0ff0xFCTb4b4b4, T79c0ff0xB1Tb4b4b4, T79c0ff0x5BTb4b4b4, T79c0ff0x6ATb4b4b4, T79c0ff0xCBTb4b4b4, T79c0ff0xBETb4b4b4, T79c0ff0x39Tb4b4b4, T79c0ff0x4ATb4b4b4, T79c0ff0x4CTb4b4b4, T79c0ff0x58Tb4b4b4, T79c0ff0xCFTb4b4b4,
T79c0ff0xD0Tb4b4b4, T79c0ff0xEFTb4b4b4, T79c0ff0xAATb4b4b4, T79c0ff0xFBTb4b4b4, T79c0ff0x43Tb4b4b4, T79c0ff0x4DTb4b4b4, T79c0ff0x33Tb4b4b4, T79c0ff0x85Tb4b4b4, T79c0ff0x45Tb4b4b4, T79c0ff0xF9Tb4b4b4, T79c0ff0x02Tb4b4b4, T79c0ff0x7FTb4b4b4, T79c0ff0x50Tb4b4b4, T79c0ff0x3CTb4b4b4, T79c0ff0x9FTb4b4b4, T79c0ff0xA8Tb4b4b4,
T79c0ff0x51Tb4b4b4, T79c0ff0xA3Tb4b4b4, T79c0ff0x40Tb4b4b4, T79c0ff0x8FTb4b4b4, T79c0ff0x92Tb4b4b4, T79c0ff0x9DTb4b4b4, T79c0ff0x38Tb4b4b4, T79c0ff0xF5Tb4b4b4, T79c0ff0xBCTb4b4b4, T79c0ff0xB6Tb4b4b4, T79c0ff0xDATb4b4b4, T79c0ff0x21Tb4b4b4, T79c0ff0x10Tb4b4b4, T79c0ff0xFFTb4b4b4, T79c0ff0xF3Tb4b4b4, T79c0ff0xD2Tb4b4b4,
T79c0ff0xCDTb4b4b4, T79c0ff0x0CTb4b4b4, T79c0ff0x13Tb4b4b4, T79c0ff0xECTb4b4b4, T79c0ff0x5FTb4b4b4, T79c0ff0x97Tb4b4b4, T79c0ff0x44Tb4b4b4, T79c0ff0x17Tb4b4b4, T79c0ff0xC4Tb4b4b4, T79c0ff0xA7Tb4b4b4, T79c0ff0x7ETb4b4b4, T79c0ff0x3DTb4b4b4, T79c0ff0x64Tb4b4b4, T79c0ff0x5DTb4b4b4, T79c0ff0x19Tb4b4b4, T79c0ff0x73Tb4b4b4,
T79c0ff0x60Tb4b4b4, T79c0ff0x81Tb4b4b4, T79c0ff0x4FTb4b4b4, T79c0ff0xDCTb4b4b4, T79c0ff0x22Tb4b4b4, T79c0ff0x2ATb4b4b4, T79c0ff0x90Tb4b4b4, T79c0ff0x88Tb4b4b4, T79c0ff0x46Tb4b4b4, T79c0ff0xEETb4b4b4, T79c0ff0xB8Tb4b4b4, T79c0ff0x14Tb4b4b4, T79c0ff0xDETb4b4b4, T79c0ff0x5ETb4b4b4, T79c0ff0x0BTb4b4b4, T79c0ff0xDBTb4b4b4,
T79c0ff0xE0Tb4b4b4, T79c0ff0x32Tb4b4b4, T79c0ff0x3ATb4b4b4, T79c0ff0x0ATb4b4b4, T79c0ff0x49Tb4b4b4, T79c0ff0x06Tb4b4b4, T79c0ff0x24Tb4b4b4, T79c0ff0x5CTb4b4b4, T79c0ff0xC2Tb4b4b4, T79c0ff0xD3Tb4b4b4, T79c0ff0xACTb4b4b4, T79c0ff0x62Tb4b4b4, T79c0ff0x91Tb4b4b4, T79c0ff0x95Tb4b4b4, T79c0ff0xE4Tb4b4b4, T79c0ff0x79Tb4b4b4,
T79c0ff0xE7Tb4b4b4, T79c0ff0xC8Tb4b4b4, T79c0ff0x37Tb4b4b4, T79c0ff0x6DTb4b4b4, T79c0ff0x8DTb4b4b4, T79c0ff0xD5Tb4b4b4, T79c0ff0x4ETb4b4b4, T79c0ff0xA9Tb4b4b4, T79c0ff0x6CTb4b4b4, T79c0ff0x56Tb4b4b4, T79c0ff0xF4Tb4b4b4, T79c0ff0xEATb4b4b4, T79c0ff0x65Tb4b4b4, T79c0ff0x7ATb4b4b4, T79c0ff0xAETb4b4b4, T79c0ff0x08Tb4b4b4,
T79c0ff0xBATb4b4b4, T79c0ff0x78Tb4b4b4, T79c0ff0x25Tb4b4b4, T79c0ff0x2ETb4b4b4, T79c0ff0x1CTb4b4b4, T79c0ff0xA6Tb4b4b4, T79c0ff0xB4Tb4b4b4, T79c0ff0xC6Tb4b4b4, T79c0ff0xE8Tb4b4b4, T79c0ff0xDDTb4b4b4, T79c0ff0x74Tb4b4b4, T79c0ff0x1FTb4b4b4, T79c0ff0x4BTb4b4b4, T79c0ff0xBDTb4b4b4, T79c0ff0x8BTb4b4b4, T79c0ff0x8ATb4b4b4,
T79c0ff0x70Tb4b4b4, T79c0ff0x3ETb4b4b4, T79c0ff0xB5Tb4b4b4, T79c0ff0x66Tb4b4b4, T79c0ff0x48Tb4b4b4, T79c0ff0x03Tb4b4b4, T79c0ff0xF6Tb4b4b4, T79c0ff0x0ETb4b4b4, T79c0ff0x61Tb4b4b4, T79c0ff0x35Tb4b4b4, T79c0ff0x57Tb4b4b4, T79c0ff0xB9Tb4b4b4, T79c0ff0x86Tb4b4b4, T79c0ff0xC1Tb4b4b4, T79c0ff0x1DTb4b4b4, T79c0ff0x9ETb4b4b4,
T79c0ff0xE1Tb4b4b4, T79c0ff0xF8Tb4b4b4, T79c0ff0x98Tb4b4b4, T79c0ff0x11Tb4b4b4, T79c0ff0x69Tb4b4b4, T79c0ff0xD9Tb4b4b4, T79c0ff0x8ETb4b4b4, T79c0ff0x94Tb4b4b4, T79c0ff0x9BTb4b4b4, T79c0ff0x1ETb4b4b4, T79c0ff0x87Tb4b4b4, T79c0ff0xE9Tb4b4b4, T79c0ff0xCETb4b4b4, T79c0ff0x55Tb4b4b4, T79c0ff0x28Tb4b4b4, T79c0ff0xDFTb4b4b4,
T79c0ff0x8CTb4b4b4, T79c0ff0xA1Tb4b4b4, T79c0ff0x89Tb4b4b4, T79c0ff0x0DTb4b4b4, T79c0ff0xBFTb4b4b4, T79c0ff0xE6Tb4b4b4, T79c0ff0x42Tb4b4b4, T79c0ff0x68Tb4b4b4, T79c0ff0x41Tb4b4b4, T79c0ff0x99Tb4b4b4, T79c0ff0x2DTb4b4b4, T79c0ff0x0FTb4b4b4, T79c0ff0xB0Tb4b4b4, T79c0ff0x54Tb4b4b4, T79c0ff0xBBTb4b4b4, T79c0ff0x16Tb4b4b4,
Tb4b4b4)

Te6edf3inv_s_box Tff7b72= Tb4b4b4(
T79c0ff0x52Tb4b4b4, T79c0ff0x09Tb4b4b4, T79c0ff0x6ATb4b4b4, T79c0ff0xD5Tb4b4b4, T79c0ff0x30Tb4b4b4, T79c0ff0x36Tb4b4b4, T79c0ff0xA5Tb4b4b4, T79c0ff0x38Tb4b4b4, T79c0ff0xBFTb4b4b4, T79c0ff0x40Tb4b4b4, T79c0ff0xA3Tb4b4b4, T79c0ff0x9ETb4b4b4, T79c0ff0x81Tb4b4b4, T79c0ff0xF3Tb4b4b4, T79c0ff0xD7Tb4b4b4, T79c0ff0xFBTb4b4b4,
T79c0ff0x7CTb4b4b4, T79c0ff0xE3Tb4b4b4, T79c0ff0x39Tb4b4b4, T79c0ff0x82Tb4b4b4, T79c0ff0x9BTb4b4b4, T79c0ff0x2FTb4b4b4, T79c0ff0xFFTb4b4b4, T79c0ff0x87Tb4b4b4, T79c0ff0x34Tb4b4b4, T79c0ff0x8ETb4b4b4, T79c0ff0x43Tb4b4b4, T79c0ff0x44Tb4b4b4, T79c0ff0xC4Tb4b4b4, T79c0ff0xDETb4b4b4, T79c0ff0xE9Tb4b4b4, T79c0ff0xCBTb4b4b4,
T79c0ff0x54Tb4b4b4, T79c0ff0x7BTb4b4b4, T79c0ff0x94Tb4b4b4, T79c0ff0x32Tb4b4b4, T79c0ff0xA6Tb4b4b4, T79c0ff0xC2Tb4b4b4, T79c0ff0x23Tb4b4b4, T79c0ff0x3DTb4b4b4, T79c0ff0xEETb4b4b4, T79c0ff0x4CTb4b4b4, T79c0ff0x95Tb4b4b4, T79c0ff0x0BTb4b4b4, T79c0ff0x42Tb4b4b4, T79c0ff0xFATb4b4b4, T79c0ff0xC3Tb4b4b4, T79c0ff0x4ETb4b4b4,
T79c0ff0x08Tb4b4b4, T79c0ff0x2ETb4b4b4, T79c0ff0xA1Tb4b4b4, T79c0ff0x66Tb4b4b4, T79c0ff0x28Tb4b4b4, T79c0ff0xD9Tb4b4b4, T79c0ff0x24Tb4b4b4, T79c0ff0xB2Tb4b4b4, T79c0ff0x76Tb4b4b4, T79c0ff0x5BTb4b4b4, T79c0ff0xA2Tb4b4b4, T79c0ff0x49Tb4b4b4, T79c0ff0x6DTb4b4b4, T79c0ff0x8BTb4b4b4, T79c0ff0xD1Tb4b4b4, T79c0ff0x25Tb4b4b4,
T79c0ff0x72Tb4b4b4, T79c0ff0xF8Tb4b4b4, T79c0ff0xF6Tb4b4b4, T79c0ff0x64Tb4b4b4, T79c0ff0x86Tb4b4b4, T79c0ff0x68Tb4b4b4, T79c0ff0x98Tb4b4b4, T79c0ff0x16Tb4b4b4, T79c0ff0xD4Tb4b4b4, T79c0ff0xA4Tb4b4b4, T79c0ff0x5CTb4b4b4, T79c0ff0xCCTb4b4b4, T79c0ff0x5DTb4b4b4, T79c0ff0x65Tb4b4b4, T79c0ff0xB6Tb4b4b4, T79c0ff0x92Tb4b4b4,
T79c0ff0x6CTb4b4b4, T79c0ff0x70Tb4b4b4, T79c0ff0x48Tb4b4b4, T79c0ff0x50Tb4b4b4, T79c0ff0xFDTb4b4b4, T79c0ff0xEDTb4b4b4, T79c0ff0xB9Tb4b4b4, T79c0ff0xDATb4b4b4, T79c0ff0x5ETb4b4b4, T79c0ff0x15Tb4b4b4, T79c0ff0x46Tb4b4b4, T79c0ff0x57Tb4b4b4, T79c0ff0xA7Tb4b4b4, T79c0ff0x8DTb4b4b4, T79c0ff0x9DTb4b4b4, T79c0ff0x84Tb4b4b4,
T79c0ff0x90Tb4b4b4, T79c0ff0xD8Tb4b4b4, T79c0ff0xABTb4b4b4, T79c0ff0x00Tb4b4b4, T79c0ff0x8CTb4b4b4, T79c0ff0xBCTb4b4b4, T79c0ff0xD3Tb4b4b4, T79c0ff0x0ATb4b4b4, T79c0ff0xF7Tb4b4b4, T79c0ff0xE4Tb4b4b4, T79c0ff0x58Tb4b4b4, T79c0ff0x05Tb4b4b4, T79c0ff0xB8Tb4b4b4, T79c0ff0xB3Tb4b4b4, T79c0ff0x45Tb4b4b4, T79c0ff0x06Tb4b4b4,
T79c0ff0xD0Tb4b4b4, T79c0ff0x2CTb4b4b4, T79c0ff0x1ETb4b4b4, T79c0ff0x8FTb4b4b4, T79c0ff0xCATb4b4b4, T79c0ff0x3FTb4b4b4, T79c0ff0x0FTb4b4b4, T79c0ff0x02Tb4b4b4, T79c0ff0xC1Tb4b4b4, T79c0ff0xAFTb4b4b4, T79c0ff0xBDTb4b4b4, T79c0ff0x03Tb4b4b4, T79c0ff0x01Tb4b4b4, T79c0ff0x13Tb4b4b4, T79c0ff0x8ATb4b4b4, T79c0ff0x6BTb4b4b4,
T79c0ff0x3ATb4b4b4, T79c0ff0x91Tb4b4b4, T79c0ff0x11Tb4b4b4, T79c0ff0x41Tb4b4b4, T79c0ff0x4FTb4b4b4, T79c0ff0x67Tb4b4b4, T79c0ff0xDCTb4b4b4, T79c0ff0xEATb4b4b4, T79c0ff0x97Tb4b4b4, T79c0ff0xF2Tb4b4b4, T79c0ff0xCFTb4b4b4, T79c0ff0xCETb4b4b4, T79c0ff0xF0Tb4b4b4, T79c0ff0xB4Tb4b4b4, T79c0ff0xE6Tb4b4b4, T79c0ff0x73Tb4b4b4,
T79c0ff0x96Tb4b4b4, T79c0ff0xACTb4b4b4, T79c0ff0x74Tb4b4b4, T79c0ff0x22Tb4b4b4, T79c0ff0xE7Tb4b4b4, T79c0ff0xADTb4b4b4, T79c0ff0x35Tb4b4b4, T79c0ff0x85Tb4b4b4, T79c0ff0xE2Tb4b4b4, T79c0ff0xF9Tb4b4b4, T79c0ff0x37Tb4b4b4, T79c0ff0xE8Tb4b4b4, T79c0ff0x1CTb4b4b4, T79c0ff0x75Tb4b4b4, T79c0ff0xDFTb4b4b4, T79c0ff0x6ETb4b4b4,
T79c0ff0x47Tb4b4b4, T79c0ff0xF1Tb4b4b4, T79c0ff0x1ATb4b4b4, T79c0ff0x71Tb4b4b4, T79c0ff0x1DTb4b4b4, T79c0ff0x29Tb4b4b4, T79c0ff0xC5Tb4b4b4, T79c0ff0x89Tb4b4b4, T79c0ff0x6FTb4b4b4, T79c0ff0xB7Tb4b4b4, T79c0ff0x62Tb4b4b4, T79c0ff0x0ETb4b4b4, T79c0ff0xAATb4b4b4, T79c0ff0x18Tb4b4b4, T79c0ff0xBETb4b4b4, T79c0ff0x1BTb4b4b4,
T79c0ff0xFCTb4b4b4, T79c0ff0x56Tb4b4b4, T79c0ff0x3ETb4b4b4, T79c0ff0x4BTb4b4b4, T79c0ff0xC6Tb4b4b4, T79c0ff0xD2Tb4b4b4, T79c0ff0x79Tb4b4b4, T79c0ff0x20Tb4b4b4, T79c0ff0x9ATb4b4b4, T79c0ff0xDBTb4b4b4, T79c0ff0xC0Tb4b4b4, T79c0ff0xFETb4b4b4, T79c0ff0x78Tb4b4b4, T79c0ff0xCDTb4b4b4, T79c0ff0x5ATb4b4b4, T79c0ff0xF4Tb4b4b4,
T79c0ff0x1FTb4b4b4, T79c0ff0xDDTb4b4b4, T79c0ff0xA8Tb4b4b4, T79c0ff0x33Tb4b4b4, T79c0ff0x88Tb4b4b4, T79c0ff0x07Tb4b4b4, T79c0ff0xC7Tb4b4b4, T79c0ff0x31Tb4b4b4, T79c0ff0xB1Tb4b4b4, T79c0ff0x12Tb4b4b4, T79c0ff0x10Tb4b4b4, T79c0ff0x59Tb4b4b4, T79c0ff0x27Tb4b4b4, T79c0ff0x80Tb4b4b4, T79c0ff0xECTb4b4b4, T79c0ff0x5FTb4b4b4,
T79c0ff0x60Tb4b4b4, T79c0ff0x51Tb4b4b4, T79c0ff0x7FTb4b4b4, T79c0ff0xA9Tb4b4b4, T79c0ff0x19Tb4b4b4, T79c0ff0xB5Tb4b4b4, T79c0ff0x4ATb4b4b4, T79c0ff0x0DTb4b4b4, T79c0ff0x2DTb4b4b4, T79c0ff0xE5Tb4b4b4, T79c0ff0x7ATb4b4b4, T79c0ff0x9FTb4b4b4, T79c0ff0x93Tb4b4b4, T79c0ff0xC9Tb4b4b4, T79c0ff0x9CTb4b4b4, T79c0ff0xEFTb4b4b4,
T79c0ff0xA0Tb4b4b4, T79c0ff0xE0Tb4b4b4, T79c0ff0x3BTb4b4b4, T79c0ff0x4DTb4b4b4, T79c0ff0xAETb4b4b4, T79c0ff0x2ATb4b4b4, T79c0ff0xF5Tb4b4b4, T79c0ff0xB0Tb4b4b4, T79c0ff0xC8Tb4b4b4, T79c0ff0xEBTb4b4b4, T79c0ff0xBBTb4b4b4, T79c0ff0x3CTb4b4b4, T79c0ff0x83Tb4b4b4, T79c0ff0x53Tb4b4b4, T79c0ff0x99Tb4b4b4, T79c0ff0x61Tb4b4b4,
T79c0ff0x17Tb4b4b4, T79c0ff0x2BTb4b4b4, T79c0ff0x04Tb4b4b4, T79c0ff0x7ETb4b4b4, T79c0ff0xBATb4b4b4, T79c0ff0x77Tb4b4b4, T79c0ff0xD6Tb4b4b4, T79c0ff0x26Tb4b4b4, T79c0ff0xE1Tb4b4b4, T79c0ff0x69Tb4b4b4, T79c0ff0x14Tb4b4b4, T79c0ff0x63Tb4b4b4, T79c0ff0x55Tb4b4b4, T79c0ff0x21Tb4b4b4, T79c0ff0x0CTb4b4b4, T79c0ff0x7DTb4b4b4,
Tb4b4b4)


T8b949e## AES AddRoundKey
T8b949e# Round constants https://en.wikipedia.org/wiki/AES_key_schedule#Round_constants
Te6edf3r_con Tff7b72= Tb4b4b4(
T79c0ff0x00Tb4b4b4, T79c0ff0x01Tb4b4b4, T79c0ff0x02Tb4b4b4, T79c0ff0x04Tb4b4b4, T79c0ff0x08Tb4b4b4, T79c0ff0x10Tb4b4b4, T79c0ff0x20Tb4b4b4, T79c0ff0x40Tb4b4b4,
T79c0ff0x80Tb4b4b4, T79c0ff0x1BTb4b4b4, T79c0ff0x36Tb4b4b4, T79c0ff0x6CTb4b4b4, T79c0ff0xD8Tb4b4b4, T79c0ff0xABTb4b4b4, T79c0ff0x4DTb4b4b4, T79c0ff0x9ATb4b4b4,
T79c0ff0x2FTb4b4b4, T79c0ff0x5ETb4b4b4, T79c0ff0xBCTb4b4b4, T79c0ff0x63Tb4b4b4, T79c0ff0xC6Tb4b4b4, T79c0ff0x97Tb4b4b4, T79c0ff0x35Tb4b4b4, T79c0ff0x6ATb4b4b4,
T79c0ff0xD4Tb4b4b4, T79c0ff0xB3Tb4b4b4, T79c0ff0x7DTb4b4b4, T79c0ff0xFATb4b4b4, T79c0ff0xEFTb4b4b4, T79c0ff0xC5Tb4b4b4, T79c0ff0x91Tb4b4b4, T79c0ff0x39Tb4b4b4,
Tb4b4b4)

Tff7b72def Td2a8ffadd_round_keyTb4b4b4(Te6edf3sTb4b4b4, Te6edf3kTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff4Tb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3j Tff7b72in Tffa657rangeTb4b4b4(T79c0ff4Tb4b4b4)Tb4b4b4:
Te6edf3sTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[Te6edf3jTb4b4b4] Tff7b72^Tff7b72= Te6edf3kTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[Te6edf3jTb4b4b4]


T8b949e## AES SubBytes
Tff7b72def Td2a8ffsub_bytesTb4b4b4(Te6edf3sTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff4Tb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3j Tff7b72in Tffa657rangeTb4b4b4(T79c0ff4Tb4b4b4)Tb4b4b4:
Te6edf3sTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[Te6edf3jTb4b4b4] Tff7b72= Te6edf3s_boxTb4b4b4[Te6edf3sTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[Te6edf3jTb4b4b4]Tb4b4b4]


Tff7b72def Td2a8ffinv_sub_bytesTb4b4b4(Te6edf3sTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff4Tb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3j Tff7b72in Tffa657rangeTb4b4b4(T79c0ff4Tb4b4b4)Tb4b4b4:
Te6edf3sTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[Te6edf3jTb4b4b4] Tff7b72= Te6edf3inv_s_boxTb4b4b4[Te6edf3sTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[Te6edf3jTb4b4b4]Tb4b4b4]


T8b949e## AES ShiftRows
Tff7b72def Td2a8ffshift_rowsTb4b4b4(Te6edf3sTb4b4b4)Tb4b4b4:
Te6edf3sTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Te6edf3sTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3sTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4] Tff7b72= Te6edf3sTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]
Te6edf3sTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4] Tff7b72= Te6edf3sTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]


Tff7b72def Td2a8ffinv_shift_rowsTb4b4b4(Te6edf3sTb4b4b4)Tb4b4b4:
Te6edf3sTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Te6edf3sTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4]
Te6edf3sTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4] Tff7b72= Te6edf3sTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]
Te6edf3sTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4] Tff7b72= Te6edf3sTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4, Te6edf3sTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]


T8b949e## AES MixColumns
T8b949e# learned from http://cs.ucsb.edu/~koc/cs178/projects/JT/aes.c
Te6edf3xtime Tff7b72= Tff7b72lambda Te6edf3aTb4b4b4: Tb4b4b4(Tb4b4b4(Tb4b4b4(Te6edf3a Tff7b72<< T79c0ff1Tb4b4b4) Tff7b72^ T79c0ff0x1BTb4b4b4) Tff7b72& T79c0ff0xFFTb4b4b4) Tff7b72if Tb4b4b4(Te6edf3a Tff7b72& T79c0ff0x80Tb4b4b4) Tff7b72else Tb4b4b4(Te6edf3a Tff7b72<< T79c0ff1Tb4b4b4)


Tff7b72def Td2a8ffmix_single_columnTb4b4b4(Te6edf3aTb4b4b4)Tb4b4b4:
T8b949e# see Sec 4.1.2 in The Design of Rijndael
Te6edf3t Tff7b72= Te6edf3aTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72^ Te6edf3aTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72^ Te6edf3aTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72^ Te6edf3aTb4b4b4[T79c0ff3Tb4b4b4]
Te6edf3u Tff7b72= Te6edf3aTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3aTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72^Tff7b72= Te6edf3t Tff7b72^ Te6edf3xtimeTb4b4b4(Te6edf3aTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72^ Te6edf3aTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Te6edf3aTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72^Tff7b72= Te6edf3t Tff7b72^ Te6edf3xtimeTb4b4b4(Te6edf3aTb4b4b4[T79c0ff1Tb4b4b4] Tff7b72^ Te6edf3aTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4)
Te6edf3aTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72^Tff7b72= Te6edf3t Tff7b72^ Te6edf3xtimeTb4b4b4(Te6edf3aTb4b4b4[T79c0ff2Tb4b4b4] Tff7b72^ Te6edf3aTb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4)
Te6edf3aTb4b4b4[T79c0ff3Tb4b4b4] Tff7b72^Tff7b72= Te6edf3t Tff7b72^ Te6edf3xtimeTb4b4b4(Te6edf3aTb4b4b4[T79c0ff3Tb4b4b4] Tff7b72^ Te6edf3uTb4b4b4)


Tff7b72def Td2a8ffmix_columnsTb4b4b4(Te6edf3sTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff4Tb4b4b4)Tb4b4b4:
Te6edf3mix_single_columnTb4b4b4(Te6edf3sTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)


Tff7b72def Td2a8ffinv_mix_columnsTb4b4b4(Te6edf3sTb4b4b4)Tb4b4b4:
T8b949e# see Sec 4.1.3 in The Design of Rijndael
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff4Tb4b4b4)Tb4b4b4:
Te6edf3u Tff7b72= Te6edf3xtimeTb4b4b4(Te6edf3xtimeTb4b4b4(Te6edf3sTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4] Tff7b72^ Te6edf3sTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3v Tff7b72= Te6edf3xtimeTb4b4b4(Te6edf3xtimeTb4b4b4(Te6edf3sTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4] Tff7b72^ Te6edf3sTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3sTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4] Tff7b72^Tff7b72= Te6edf3u
Te6edf3sTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4] Tff7b72^Tff7b72= Te6edf3v
Te6edf3sTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff2Tb4b4b4] Tff7b72^Tff7b72= Te6edf3u
Te6edf3sTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4[T79c0ff3Tb4b4b4] Tff7b72^Tff7b72= Te6edf3v

Te6edf3mix_columnsTb4b4b4(Te6edf3sTb4b4b4)

T8b949e## AES Bytes
Tff7b72def Td2a8ffbytes2matrixTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4:
T8b949e""" Converts a 16-byte array into a 4x4 matrix. """
Tff7b72return Tb4b4b4[Tffa657listTb4b4b4(Te6edf3textTb4b4b4[Te6edf3iTb4b4b4:Te6edf3iTff7b72+T79c0ff4Tb4b4b4]Tb4b4b4) Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff0Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3textTb4b4b4)Tb4b4b4, T79c0ff4Tb4b4b4)Tb4b4b4]

Tff7b72def Td2a8ffmatrix2bytesTb4b4b4(Te6edf3matrixTb4b4b4)Tb4b4b4:
T8b949e""" Converts a 4x4 matrix into a 16-byte array. """
Tff7b72return Tffa657bytesTb4b4b4(Tffa657sumTb4b4b4(Te6edf3matrixTb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)Tb4b4b4)


Tff7b72def Td2a8ffxor_bytesTb4b4b4(Te6edf3aTb4b4b4, Te6edf3bTb4b4b4)Tb4b4b4:
T8b949e""" Returns a new byte array with the elements xor'ed. """
Tff7b72return Tffa657bytesTb4b4b4(Te6edf3iTff7b72^Te6edf3j Tff7b72for Te6edf3iTb4b4b4, Te6edf3j Tff7b72in Tffa657zipTb4b4b4(Te6edf3aTb4b4b4, Te6edf3bTb4b4b4)Tb4b4b4)


Tff7b72def Td2a8ffsplit_blocksTb4b4b4(Te6edf3messageTb4b4b4, Te6edf3block_sizeTff7b72=T79c0ff16Tb4b4b4, Te6edf3require_paddingTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3messageTb4b4b4) Tff7b72% Te6edf3block_size Tff7b72== T79c0ff0 Tff7b72or Tff7b72not Te6edf3require_padding
Tff7b72return Tb4b4b4[Te6edf3messageTb4b4b4[Te6edf3iTb4b4b4:Te6edf3iTff7b72+T79c0ff16Tb4b4b4] Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff0Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3messageTb4b4b4)Tb4b4b4, Te6edf3block_sizeTb4b4b4)Tb4b4b4]

Tff7b72class T56d364AES128Tb4b4b4:
T8b949e# AES-128 block size
Te6edf3block_size Tff7b72= T79c0ff16
T8b949e# AES-128 encrypts messages with 10 rounds
Te6edf3_rounds Tff7b72= T79c0ff10


T8b949e# initiate the AES objecy
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3keyTb4b4b4)Tb4b4b4:
T8b949e"""
Initializes the object with a given key.
"""
T8b949e# make sure key length is right
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3keyTb4b4b4) Tff7b72== Te6edf3AES128Tff7b72.Td2a8ffblock_size

T8b949e# ExpandKey
Tff7b72selfTff7b72.Td2a8ff_round_keys Tff7b72= Tff7b72selfTff7b72.Td2a8ff_expand_keyTb4b4b4(Te6edf3keyTb4b4b4)


T8b949e# will perform the AES ExpandKey phase
Tff7b72def Td2a8ff_expand_keyTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3master_keyTb4b4b4)Tb4b4b4:
T8b949e"""
Expands and returns a list of key matrices for the given master_key.
"""

T8b949e# Initialize round keys with raw key material.
Te6edf3key_columns Tff7b72= Te6edf3bytes2matrixTb4b4b4(Te6edf3master_keyTb4b4b4)
Te6edf3iteration_size Tff7b72= Tffa657lenTb4b4b4(Te6edf3master_keyTb4b4b4) Tff7b72/Tff7b72/ T79c0ff4

T8b949e# Each iteration has exactly as many columns as the key material.
Te6edf3i Tff7b72= T79c0ff1
Tff7b72while Tffa657lenTb4b4b4(Te6edf3key_columnsTb4b4b4) Tff7b72< Tb4b4b4(Tff7b72selfTff7b72.Td2a8ff_rounds Tff7b72+ T79c0ff1Tb4b4b4) Tff7b72* T79c0ff4Tb4b4b4:
T8b949e# Copy previous word.
Te6edf3word Tff7b72= Tffa657listTb4b4b4(Te6edf3key_columnsTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4)

T8b949e# Perform schedule_core once every "row".
Tff7b72if Tffa657lenTb4b4b4(Te6edf3key_columnsTb4b4b4) Tff7b72% Te6edf3iteration_size Tff7b72== T79c0ff0Tb4b4b4:
T8b949e# Circular shift.
Te6edf3wordTff7b72.Td2a8ffappendTb4b4b4(Te6edf3wordTff7b72.Td2a8ffpopTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4)
T8b949e# Map to S-BOX.
Te6edf3word Tff7b72= Tb4b4b4[Te6edf3s_boxTb4b4b4[Te6edf3bTb4b4b4] Tff7b72for Te6edf3b Tff7b72in Te6edf3wordTb4b4b4]
T8b949e# XOR with first byte of R-CON, since the others bytes of R-CON are 0.
Te6edf3wordTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72^Tff7b72= Te6edf3r_conTb4b4b4[Te6edf3iTb4b4b4]
Te6edf3i Tff7b72+Tff7b72= T79c0ff1
Tff7b72elif Tffa657lenTb4b4b4(Te6edf3master_keyTb4b4b4) Tff7b72== T79c0ff32 Tff7b72and Tffa657lenTb4b4b4(Te6edf3key_columnsTb4b4b4) Tff7b72% Te6edf3iteration_size Tff7b72== T79c0ff4Tb4b4b4:
T8b949e# Run word through S-box in the fourth iteration when using a
T8b949e# 256-bit key.
Te6edf3word Tff7b72= Tb4b4b4[Te6edf3s_boxTb4b4b4[Te6edf3bTb4b4b4] Tff7b72for Te6edf3b Tff7b72in Te6edf3wordTb4b4b4]

T8b949e# XOR with equivalent word from previous iteration.
Te6edf3word Tff7b72= Tffa657bytesTb4b4b4(Te6edf3iTff7b72^Te6edf3j Tff7b72for Te6edf3iTb4b4b4, Te6edf3j Tff7b72in Tffa657zipTb4b4b4(Te6edf3wordTb4b4b4, Te6edf3key_columnsTb4b4b4[Tff7b72-Te6edf3iteration_sizeTb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3key_columnsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3wordTb4b4b4)

T8b949e# Group key words in 4x4 byte matrices.
Tff7b72return Tb4b4b4[Te6edf3key_columnsTb4b4b4[T79c0ff4Tff7b72*Te6edf3i Tb4b4b4: T79c0ff4Tff7b72*Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tb4b4b4] Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(Tffa657lenTb4b4b4(Te6edf3key_columnsTb4b4b4) Tff7b72/Tff7b72/ T79c0ff4Tb4b4b4)Tb4b4b4]


T8b949e# encrypt a single block of data with AES
Tff7b72def Td2a8ff_encrypt_blockTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3plaintextTb4b4b4)Tb4b4b4:
T8b949e"""
Encrypts a single block of 16 byte long plaintext.
"""
T8b949e# length of a single block
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3plaintextTb4b4b4) Tff7b72== Te6edf3AES128Tff7b72.Td2a8ffblock_size

T8b949e# perform on a matrix
Te6edf3state Tff7b72= Te6edf3bytes2matrixTb4b4b4(Te6edf3plaintextTb4b4b4)

T8b949e# AddRoundKey
Te6edf3add_round_keyTb4b4b4(Te6edf3stateTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_round_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)

T8b949e# 9 main rounds
Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(T79c0ff1Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_roundsTb4b4b4)Tb4b4b4:
T8b949e# SubBytes
Te6edf3sub_bytesTb4b4b4(Te6edf3stateTb4b4b4)
T8b949e# ShiftRows
Te6edf3shift_rowsTb4b4b4(Te6edf3stateTb4b4b4)
T8b949e# MixCols
Te6edf3mix_columnsTb4b4b4(Te6edf3stateTb4b4b4)
T8b949e# AddRoundKey
Te6edf3add_round_keyTb4b4b4(Te6edf3stateTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_round_keysTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)

T8b949e# last round, w/t AddRoundKey step
Te6edf3sub_bytesTb4b4b4(Te6edf3stateTb4b4b4)
Te6edf3shift_rowsTb4b4b4(Te6edf3stateTb4b4b4)
Te6edf3add_round_keyTb4b4b4(Te6edf3stateTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_round_keysTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4)

T8b949e# return the encrypted matrix as bytes
Tff7b72return Te6edf3matrix2bytesTb4b4b4(Te6edf3stateTb4b4b4)


T8b949e# decrypt a single block of data with AES
Tff7b72def Td2a8ff_decrypt_blockTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ciphertextTb4b4b4)Tb4b4b4:
T8b949e"""
Decrypts a single block of 16 byte long ciphertext.
"""
T8b949e# length of a single block
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3ciphertextTb4b4b4) Tff7b72== Te6edf3AES128Tff7b72.Td2a8ffblock_size

T8b949e# perform on a matrix
Te6edf3state Tff7b72= Te6edf3bytes2matrixTb4b4b4(Te6edf3ciphertextTb4b4b4)

T8b949e# in reverse order, last round is first
Te6edf3add_round_keyTb4b4b4(Te6edf3stateTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_round_keysTb4b4b4[Tff7b72-T79c0ff1Tb4b4b4]Tb4b4b4)
Te6edf3inv_shift_rowsTb4b4b4(Te6edf3stateTb4b4b4)
Te6edf3inv_sub_bytesTb4b4b4(Te6edf3stateTb4b4b4)

Tff7b72for Te6edf3i Tff7b72in Tffa657rangeTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_rounds Tff7b72- T79c0ff1Tb4b4b4, T79c0ff0Tb4b4b4, Tff7b72-T79c0ff1Tb4b4b4)Tb4b4b4:
T8b949e# nain rounds
Te6edf3add_round_keyTb4b4b4(Te6edf3stateTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_round_keysTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)
Te6edf3inv_mix_columnsTb4b4b4(Te6edf3stateTb4b4b4)
Te6edf3inv_shift_rowsTb4b4b4(Te6edf3stateTb4b4b4)
Te6edf3inv_sub_bytesTb4b4b4(Te6edf3stateTb4b4b4)

T8b949e# initial AddRoundKey phase
Te6edf3add_round_keyTb4b4b4(Te6edf3stateTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_round_keysTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)

T8b949e# return bytes
Tff7b72return Te6edf3matrix2bytesTb4b4b4(Te6edf3stateTb4b4b4)


T8b949e# will encrypt the entire data
Tff7b72def Td2a8ffencryptTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3plaintextTb4b4b4, Te6edf3ivTb4b4b4)Tb4b4b4:
T8b949e"""
Encrypts `plaintext` using CBC mode and PKCS#7 padding, with the given
initialization vector (iv).
"""
T8b949e# iv length must be same as block size
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3ivTb4b4b4) Tff7b72== Te6edf3AES128Tff7b72.Td2a8ffblock_size

Tff7b72assert Tffa657lenTb4b4b4(Te6edf3plaintextTb4b4b4) Tff7b72% Te6edf3AES128Tff7b72.Td2a8ffblock_size Tff7b72== T79c0ff0

Te6edf3ciphertext_blocks Tff7b72= Tb4b4b4[Tb4b4b4]

Te6edf3previous Tff7b72= Te6edf3iv
Tff7b72for Te6edf3plaintext_block Tff7b72in Te6edf3split_blocksTb4b4b4(Te6edf3plaintextTb4b4b4)Tb4b4b4:
T8b949e# in CBC mode every block is XOR'd with the previous block
Te6edf3xorred Tff7b72= Te6edf3xor_bytesTb4b4b4(Te6edf3plaintext_blockTb4b4b4, Te6edf3previousTb4b4b4)

T8b949e# encrypt current block
Te6edf3block Tff7b72= Tff7b72selfTff7b72.Td2a8ff_encrypt_blockTb4b4b4(Te6edf3xorredTb4b4b4)
Te6edf3previous Tff7b72= Te6edf3block

T8b949e# append to ciphertext
Te6edf3ciphertext_blocksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3blockTb4b4b4)

T8b949e# return as bytes
Tff7b72return Ta5d6ffbTa5d6ff'Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3ciphertext_blocksTb4b4b4)


T8b949e# will decrypt the entire data
Tff7b72def Td2a8ffdecryptTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ciphertextTb4b4b4, Te6edf3ivTb4b4b4)Tb4b4b4:
T8b949e"""
Decrypts `ciphertext` using CBC mode and PKCS#7 padding, with the given
initialization vector (iv).
"""
T8b949e# iv length must be same as block size
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3ivTb4b4b4) Tff7b72== Te6edf3AES128Tff7b72.Td2a8ffblock_size

Te6edf3plaintext_blocks Tff7b72= Tb4b4b4[Tb4b4b4]

Te6edf3previous Tff7b72= Te6edf3iv
Tff7b72for Te6edf3ciphertext_block Tff7b72in Te6edf3split_blocksTb4b4b4(Te6edf3ciphertextTb4b4b4)Tb4b4b4:
T8b949e# in CBC mode every block is XOR'd with the previous block
Te6edf3xorred Tff7b72= Te6edf3xor_bytesTb4b4b4(Te6edf3previousTb4b4b4, Tff7b72selfTff7b72.Td2a8ff_decrypt_blockTb4b4b4(Te6edf3ciphertext_blockTb4b4b4)Tb4b4b4)
T8b949e# append plaintext
Te6edf3plaintext_blocksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3xorredTb4b4b4)
Te6edf3previous Tff7b72= Te6edf3ciphertext_block

Tff7b72return Ta5d6ffbTa5d6ff'Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3plaintext_blocksTb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────